package com.gqh.weather.service;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gqh.weather.config.FileConfig;
import com.gqh.weather.config.MinioConfig;
import com.gqh.weather.domain.dto.AnswerData;
import com.gqh.weather.domain.dto.PaperPackage;
import com.gqh.weather.domain.dto.StudentPackage;
import com.gqh.weather.domain.dto.StudentPackageInfo;
import com.gqh.weather.domain.dto.StudentTicketDTO;
import com.gqh.weather.domain.dto.TaskSchedule;
import com.gqh.weather.domain.entity.PcSubtask;
import com.gqh.weather.domain.entity.Task;
import com.gqh.weather.mapper.PcSubtaskMapper;
import com.gqh.weather.mapper.StudentMapper;
import com.gqh.weather.mapper.TaskMapper;
import com.gqh.weather.util.MinioUtil;

import io.minio.MinioClient;
import io.minio.PutObjectArgs;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.gqh.weather.exception.Result;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @description PC端考务包生成服务类
 * @author AI
 * @date 2025-09-21
 */
@Service
public class PcExamPackageService {
    
    @Autowired
    private PcSubtaskMapper pcSubtaskMapper;
    
    @Autowired
    private TaskMapper taskMapper;
    
    @Autowired
    private StudentMapper studentMapper;
    
    @Autowired
    private PaperService paperService;
    
    @Autowired
    private FileConfig fileConfig;
    
    @Autowired
    private MinioConfig minioConfig;
    
    @Autowired
    private MinioUtil minioUtil;
    
    @Autowired
    private MinioClient minioClient;
    
    // 用于JSON解析
    private static final ObjectMapper objectMapper = new ObjectMapper();
    
    // 静态初始化块，配置ObjectMapper使用UTF-8编码
    static {
        // 确保JSON序列化时使用UTF-8编码
        objectMapper.configure(com.fasterxml.jackson.core.JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
        // 配置ObjectMapper忽略未知字段
        objectMapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }
    
    // ZIP文件密码
    private static final String ZIP_PASSWORD = "k5Xk@lDv7S8^iliQiemK#kGtDsSER@HE";
    
//    /**
//     * 生成考务包
//     *
//     * @param id PC子任务ID
//     */
//    public void genExamPackage(Integer id) {
//        try {
//            // 获取PC子任务信息
//            PcSubtask pcSubtask = pcSubtaskMapper.selectById(id);
//            if (pcSubtask == null) {
//                System.err.println("PC子任务不存在，ID: " + id);
//                return;
//            }
//
//            // 获取关联的任务信息
//            Task task = taskMapper.selectById(pcSubtask.getTaskPid());
//            if (task == null) {
//                System.err.println("关联的任务不存在，任务ID: " + pcSubtask.getTaskPid());
//                return;
//            }
//
//            // 创建导出目录
//            String dir = createExportDir(id);
//            if (dir == null) {
//                System.err.println("创建导出目录失败，ID: " + id);
//                return;
//            }
//
//            // 生成试卷包
//            PaperPackage paperPackage = generatePaperPackage(pcSubtask, task, dir);
//            if (paperPackage != null) {
//                // 写入试卷包JSON文件
//                String paperJsonPath = dir + "exam.json";
//                writePackage(paperJsonPath, objectMapper.writeValueAsString(paperPackage));
//            }
//
//            // 生成学生包
//            StudentPackage studentPackage = generateStudentPackage(pcSubtask, task, dir);
//            if (studentPackage != null) {
//                // 写入学生包JSON文件
//                String studentJsonPath = dir + "student.json";
//                writePackage(studentJsonPath, objectMapper.writeValueAsString(studentPackage));
//            }
//
//            // 打包成ZIP文件
//            String zipFile = zipPackage(id, dir);
//            if (zipFile != null) {
//                // 上传文件
//                String fileUrl = uploadFile(zipFile);
//                if (fileUrl != null) {
//                    // 更新任务的考务包URL
//                    updatePackageUrl(pcSubtask.getTaskPid(), fileUrl);
//                }
//            }
//
//            System.out.println("生成考务包完成，ID: " + id);
//        } catch (Exception e) {
//            System.err.println("生成考务包失败，ID: " + id + ", 错误: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }
    
//    /**
//     * 更新任务的考务包URL
//     *
//     * @param taskId 任务ID
//     * @param packageUrl 考务包URL
//     * @return 更新结果
//     */
//    private boolean updatePackageUrl(Integer taskId, String packageUrl) {
//        return taskMapper.updatePackageUrl(taskId, packageUrl) > 0;
//    }
    
//    /**
//     * 创建导出目录
//     *
//     * @param pcSubtaskId PC子任务ID
//     * @return 导出目录路径
//     */
//    private String createExportDir(Integer pcSubtaskId) {
//        try {
//            String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss"));
//            String exportDirPath = fileConfig.getExportDir() + "/export/" + pcSubtaskId + "_" + timestamp + "/";
//
//            // 创建目录
//            Path exportDir = Paths.get(exportDirPath);
//            if (!Files.exists(exportDir)) {
//                Files.createDirectories(exportDir);
//            }
//
//            // 创建图片目录
//            Path pictureDir = Paths.get(exportDirPath + "picture/");
//            if (!Files.exists(pictureDir)) {
//                Files.createDirectories(pictureDir);
//            }
//
//            return exportDirPath;
//        } catch (Exception e) {
//            System.err.println("创建导出目录失败: " + e.getMessage());
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    /**
//     * 生成试卷包
//     *
//     * @param pcSubtask PC子任务
//     * @param task 任务
//     * @param dir 导出目录
//     * @return 试卷包对象
//     */
//    private PaperPackage generatePaperPackage(PcSubtask pcSubtask, Task task, String dir) {
//        try {
//            PaperPackage paperPackage = new PaperPackage();
//            paperPackage.setExamId(pcSubtask.getId());
//            paperPackage.setExamName(task.getName() + "（机试）");
//            paperPackage.setSchoolYear(task.getSchoolYear());
//            paperPackage.setExamGrade(task.getGrade());
//            paperPackage.setStartAt(task.getStartAt());
//            paperPackage.setEndAt(task.getEndAt());
//
//            // 解析任务日程
//            List<TaskSchedule> taskSchedules = new ArrayList<>();
//            if (pcSubtask.getSchedule() != null && !pcSubtask.getSchedule().isEmpty()) {
//                taskSchedules = objectMapper.readValue(pcSubtask.getSchedule(),
//                    new TypeReference<List<TaskSchedule>>() {});
//            }
//
//            // 生成试卷信息列表
//            List<com.gqh.weather.domain.dto.PaperInfo> paperInfoList = new ArrayList<>();
//
//            // 根据日程生成试卷信息
//            for (TaskSchedule schedule : taskSchedules) {
//                // 获取试卷详细信息
//                Result<com.gqh.weather.domain.dto.PaperInfo> paperInfoResult = paperService.getPaperInfo(schedule.getPaperId());
//                if (paperInfoResult != null && paperInfoResult.getCode() == 0) {
//                    com.gqh.weather.domain.dto.PaperInfo paperInfo = paperInfoResult.getData();
//                    if (paperInfo != null) {
//                        // 更新试卷的时间信息
//                        paperInfo.setStime(schedule.getStime());
//                        paperInfo.setEtime(schedule.getEtime());
//
//                        // 下载处理图片
//                        if (paperInfo.getDataInfo() != null) {
//                            for (com.gqh.weather.domain.dto.PaperInfo.PaperInfoData paperInfoData : paperInfo.getDataInfo()) {
//                                if (paperInfoData.getQinfos() != null) {
//                                    for (com.gqh.weather.domain.dto.PaperInfo.QuestionInfos questionInfo : paperInfoData.getQinfos()) {
//                                        // 下载处理QuestionInfos的图片
//                                        if (questionInfo != null) {
//                                            // 下载处理PicUrl
//                                            if (questionInfo.getPicUrl() != null && !questionInfo.getPicUrl().isEmpty()) {
//                                                String picUrlPc = downloadPic(questionInfo.getPicUrl(), dir);
//                                                questionInfo.setPicUrlPc(picUrlPc);
//                                            }
//
//                                            // 下载处理选项中的图片
//                                            if (questionInfo.getData() != null && !questionInfo.getData().isEmpty()) {
//                                                List<AnswerData> answerDatas = objectMapper.readValue(questionInfo.getData(),
//                                                    new TypeReference<List<AnswerData>>() {});
//
//                                                for (com.gqh.weather.domain.dto.AnswerData answerData : answerDatas) {
//                                                    if (answerData.getUrl() != null && !answerData.getUrl().isEmpty()) {
//                                                        String urlPc = downloadPic(answerData.getUrl(), dir);
//                                                        answerData.setUrlPc(urlPc);
//                                                    }
//                                                }
//                                            }
//                                        }
//
//                                        // 下载处理SubIDInfos的图片
//                                        if (questionInfo.getSubIDInfos() != null) {
//                                            for (com.gqh.weather.domain.dto.PaperInfo.QuestionData subQuestionData : questionInfo.getSubIDInfos()) {
//                                                if (subQuestionData.getPicUrl() != null && !subQuestionData.getPicUrl().isEmpty()) {
//                                                    String picUrlPc = downloadPic(subQuestionData.getPicUrl(), dir);
//                                                    subQuestionData.setPicUrlPc(picUrlPc);
//                                                }
//
//                                                // 下载处理子题目选项中的图片
//                                                if (subQuestionData.getData() != null && !subQuestionData.getData().isEmpty()) {
//                                                    List<AnswerData> answerDatas = objectMapper.readValue(subQuestionData.getData(),
//                                                        new TypeReference<List<AnswerData>>() {});
//
//                                                    for (com.gqh.weather.domain.dto.AnswerData answerData : answerDatas) {
//                                                        if (answerData.getUrl() != null && !answerData.getUrl().isEmpty()) {
//                                                            String urlPc = downloadPic(answerData.getUrl(), dir);
//                                                            answerData.setUrlPc(urlPc);
//                                                        }
//                                                    }
//                                                }
//                                            }
//                                        }
//                                    }
//                                }
//                            }
//                        }
//
//                        paperInfoList.add(paperInfo);
//                    }
//                }
//            }
//
//            paperPackage.setList(paperInfoList);
//
//            return paperPackage;
//        } catch (Exception e) {
//            System.err.println("生成试卷包失败: " + e.getMessage());
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    /**
//     * 生成学生包
//     *
//     * @param pcSubtask PC子任务
//     * @param task 任务
//     * @param dir 导出目录
//     * @return 学生包对象
//     */
//    private StudentPackage generateStudentPackage(PcSubtask pcSubtask, Task task, String dir) {
//        try {
//            StudentPackage studentPackage = new StudentPackage();
//            studentPackage.setExamId(pcSubtask.getId());
//            studentPackage.setStartAt(task.getStartAt());
//            studentPackage.setEndAt(task.getEndAt());
//
//            // 获取学生信息
//            List<StudentTicketDTO> students = studentMapper.selectStudentTicketList(task.getId());
//            Map<String, StudentPackageInfo> studentMap = new HashMap<>();
//
//            // 将学生信息添加到map中
//            for (StudentTicketDTO student : students) {
//                StudentPackageInfo packageInfo = new StudentPackageInfo();
//                packageInfo.setNo(student.getStudentNo());
//                packageInfo.setName(student.getName());
//                packageInfo.setUrl(student.getPicUrl() != null ? student.getPicUrl() : "");
//                // 下载处理学生头像
//                String urlPc = "";
//                if (student.getPicUrl() != null && !student.getPicUrl().isEmpty()) {
//                    urlPc = downloadPic(student.getPicUrl(), dir);
//                }
//                packageInfo.setUrlPc(urlPc);
//                studentMap.put(student.getStudentNo(), packageInfo);
//            }
//
//            studentPackage.setList(studentMap);
//
//            return studentPackage;
//        } catch (Exception e) {
//            System.err.println("生成学生包失败: " + e.getMessage());
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    /**
//     * 写入包文件
//     *
//     * @param filename 文件名
//     * @param data 数据
//     */
//    private void writePackage(String filename, String data) {
//        try (FileOutputStream fos = new FileOutputStream(filename)) {
//            // 使用UTF-8编码写入文件，避免中文乱码
//            fos.write(data.getBytes(StandardCharsets.UTF_8));
//        } catch (IOException e) {
//            System.err.println("写入包文件失败: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 打包成ZIP文件
//     *
//     * @param pcSubtaskId PC子任务ID
//     * @param dir 导出目录
//     * @return ZIP文件路径
//     */
//    private String zipPackage(Integer pcSubtaskId, String dir) {
//        try {
//            String zipFile = dir + "exam_" + pcSubtaskId + ".pk";
//
//            try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
//                // 注意：Java标准库不支持加密ZIP，这里简化处理
//                // 实际应用中可能需要使用第三方库如zip4j来支持加密
//
//                // 使用Files.walk方法遍历目录中的所有文件
//                Path rootPath = Paths.get(dir);
//                Files.walk(rootPath)
//                    .filter(path -> !Files.isDirectory(path))  // 过滤掉目录
//                    .filter(path -> {
//                        // 跳过.pk文件本身
//                        String fileName = path.getFileName().toString();
//                        return !fileName.endsWith(".pk") && fileName.lastIndexOf('.') != -1;
//                    })
//                    .forEach(path -> {
//                        try {
//                            // 计算相对路径
//                            String relativePath = rootPath.relativize(path).toString().replace("\\", "/");
//
//                            // 创建ZIP条目
//                            ZipEntry zipEntry = new ZipEntry(relativePath);
//                            zipOut.putNextEntry(zipEntry);
//
//                            // 读取文件内容并写入ZIP
//                            Files.copy(path, zipOut);
//                            zipOut.closeEntry();
//                        } catch (IOException e) {
//                            System.err.println("添加文件到ZIP失败: " + e.getMessage());
//                            e.printStackTrace();
//                        }
//                    });
//            }
//
//            return zipFile;
//        } catch (Exception e) {
//            System.err.println("打包ZIP文件失败: " + e.getMessage());
//            e.printStackTrace();
//            return null;
//        }
//    }
    
//    /**
//     * 下载图片并保存到本地
//     *
//     * @param url 图片URL
//     * @param dir 保存目录
//     * @return 图片相对路径
//     */
//    private String downloadPic(String url, String dir) {
//        if (url == null || url.isEmpty()) {
//            return "";
//        }
//
//        try {
//            // 创建URL对象
//            java.net.URL picUrl = new java.net.URL(url);
//
//            // 打开连接
//            java.net.HttpURLConnection connection = (java.net.HttpURLConnection) picUrl.openConnection();
//            connection.setRequestMethod("GET");
//            connection.setConnectTimeout(5000);
//            connection.setReadTimeout(5000);
//
//            // 获取文件扩展名
//            String fileExt = ".jpg"; // 默认扩展名
//            String path = picUrl.getPath();
//            int lastDotIndex = path.lastIndexOf('.');
//            if (lastDotIndex > 0) {
//                fileExt = path.substring(lastDotIndex);
//            }
//
//            // 生成唯一文件名
//            String fileName = "picture/" + java.util.UUID.randomUUID().toString() + fileExt;
//            String filePath = dir + fileName;
//
//            // 创建目录
//            File pictureDir = new File(dir + "picture");
//            if (!pictureDir.exists()) {
//                pictureDir.mkdirs();
//            }
//
//            // 下载并保存文件
//            try (java.io.InputStream in = connection.getInputStream();
//                 java.io.FileOutputStream out = new java.io.FileOutputStream(filePath)) {
//
//                byte[] buffer = new byte[4096];
//                int bytesRead;
//                while ((bytesRead = in.read(buffer)) != -1) {
//                    out.write(buffer, 0, bytesRead);
//                }
//            }
//
//            return fileName;
//        } catch (Exception e) {
//            System.err.println("下载图片失败: " + e.getMessage());
//            e.printStackTrace();
//            return "";
//        }
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param filePath 文件路径
//     * @return 文件URL
//     */
//    private String uploadFile(String filePath) {
//        try {
//            File file = new File(filePath);
//            String objectName = "exam_packages/" + file.getName();
//
//            // 上传到MinIO
//            try (FileInputStream fis = new FileInputStream(file)) {
//                minioClient.putObject(
//                    PutObjectArgs.builder()
//                        .bucket(minioConfig.getBucketStudentFace())
//                        .object(objectName)
//                        .stream(fis, file.length(), -1)
//                        .contentType("application/octet-stream")
//                        .build()
//                );
//            }
//
//            // 返回文件URL
//            return "/files" + minioConfig.getBucketStudentFace() + "/" + objectName;
//        } catch (Exception e) {
//            System.err.println("上传文件失败: " + e.getMessage());
//            e.printStackTrace();
//            return null;
//        }
//    }
}